Cos'è funzione hash?

Funzione Hash

Una funzione hash è una funzione matematica che trasforma un input di dimensione arbitraria (chiamato "messaggio" o "chiave") in un output di dimensione fissa (chiamato "hash value," "hash code," "message digest," o semplicemente "hash").

Le funzioni hash sono ampiamente utilizzate in informatica per diverse finalità, tra cui:

  • Tabelle hash: Per implementare strutture dati efficienti per la ricerca, l'inserimento e la cancellazione di dati. In questo contesto, l'hash viene utilizzato per calcolare l'indice di un array in cui memorizzare i dati.
  • Crittografia: Per generare impronte digitali (fingerprint) dei dati, utilizzate per la verifica dell'integrità dei dati, l'autenticazione e la memorizzazione sicura delle password.
  • Checksum: Per rilevare errori di trasmissione o archiviazione dei dati.
  • Ricerca: Per accelerare la ricerca di elementi in grandi insiemi di dati.

Caratteristiche importanti di una funzione hash:

  • Determinismo: Per lo stesso input, la funzione hash deve sempre produrre lo stesso output.
  • Uniformità: Una buona funzione hash dovrebbe distribuire uniformemente i valori hash generati sull'intervallo di output, riducendo al minimo le collisioni. Una collisione si verifica quando due input diversi producono lo stesso valore hash.
  • Efficienza: Il calcolo dell'hash deve essere rapido ed efficiente.

Proprietà desiderabili (soprattutto in contesti crittografici):

  • Resistenza alla preimmagine: Dato un valore hash, dovrebbe essere computazionalmente infeasible trovare un input che produca quel valore hash. Questo è anche noto come proprietà "unidirezionale".
  • Resistenza alla seconda preimmagine: Dato un input e il suo valore hash, dovrebbe essere computazionalmente infeasible trovare un secondo input diverso che produca lo stesso valore hash.
  • Resistenza alle collisioni: Dovrebbe essere computazionalmente infeasible trovare due input diversi che producano lo stesso valore hash. Questa è la proprietà più forte e implica la resistenza alla preimmagine e alla seconda preimmagine.

Esempi di funzioni hash:

Esistono numerosi algoritmi di hash, ognuno con le proprie caratteristiche e compromessi in termini di velocità, sicurezza e resistenza alle collisioni. Alcuni esempi comuni includono:

  • MD5: (obsoleto per scopi crittografici a causa di vulnerabilità).
  • SHA-1: (obsoleto per scopi crittografici a causa di vulnerabilità).
  • SHA-2 (SHA-256, SHA-512, ecc.): Famiglia di funzioni hash ampiamente utilizzate e considerate sicure.
  • SHA-3: Un'altra famiglia di funzioni hash progettata per essere una alternativa a SHA-2.
  • bcrypt: Una funzione hash progettata specificamente per la memorizzazione sicura delle password.
  • Argon2: Un'altra funzione hash moderna progettata per la memorizzazione sicura delle password, con lo scopo di resistere ad attacchi di forza bruta.

La scelta della funzione hash appropriata dipende dall'applicazione specifica e dai requisiti di sicurezza. Per applicazioni crittografiche, è fondamentale utilizzare funzioni hash robuste e resistenti ad attacchi noti. Per applicazioni non crittografiche, come le tabelle hash, la velocità e l'uniformità possono essere più importanti della sicurezza.